Le widget calendrier permet d'afficher et de récupérer des informations relatives à la date. C'est un widget facile à créer et à utiliser. Utilisez:
calendarNew:: IO Calendar
Par défaut, la date du jour est affichée. Pour récupérer la date d'un calendrier, utilisez:
calendarGetDate :: CalendarClass self => self -> IO (Int, Int, Int)
La sortie est de type (année,mois,jour). Notez que les mois commencent à 0. Il faut donc ajouter 1 pour que ce soit correct. Les attributs associés sont:
calendarYear :: CalendarClass self => Attr self Int
calendarMonth :: CalendarClass self => Attr self Int
calendarDay :: CalendarClass self => Attr self Int
Le widget calendrier a quelques options qui permettent de modifier l'apparence du widget. On modifie ces options avec la fonction: calendarSetDisplayOptions. Pour récupérer les réglages, on utilise : calendarGetDisplayOptions.
calendarSetDisplayOptions :: CalendarClass self => self -> [CalendarDisplayOptions] -> IO ()
calendarGetDisplayOptions :: CalendarClass self => self -> IO [CalendarDisplayOptions]
CalendarDisplayOptions
a les constructeurs suivant:
CalendarShowHeading
Cette option indique que le mois et l'année doivent être affichés quand le calendrier s'affiche.
CalendarShowDayNames
Cette option indique que les 3 premières lettres de chaque jour doivent être affichées (Lun, Mar, …).
CalendarNoMonthChange
Cette option empêche l'utilisateur de modifier le mois affiché. Cela peut être utile si vous avez seulement besoin d'afficher un mois en particulier.
CalendarShowWeekNumbers
Cette option indique que le numéro de la semaine doit être indiqué en bas à gauche du calendrier.
CalendarWeekStartMonday
Cette option indique que le calendrier doit démarrer le Lundi et pas le Dimanche (par défaut). Cela affecte seulement l'ordre dans lequel les jours sont affichés de gauche à droite.
Ces options peuvent aussi être définies et récupérées avec les fonctions génériques get
et set
.
Finalement, n'importe quel nombre de jours dans le mois peuvent être "marqués". Un jour marqué est mis en surbrillance dans le calendrier. Les fonctions suivantes sont fournies pour manipuler les jours marqués:
calendarMarkDay :: CalendarClass self => self -> Int -> IO Bool
calendarUnmarkDay :: CalendarClass self => self -> Int -> IO Bool
calendarClearMarks :: CalendarClass self => self -> IO ()
Notez que les "marquages" sont persistants quand on navigue à travers les mois et les années.
Le widget calendrier peut envoyer des signaux indiquant les modifications de la date. Ces signaux sont:
onDaySelected
onDaySelectedDoubleClick
L'exemple suivant montre l'utilisation d'un widget calendrier:
import Graphics.UI.Gtk
main :: IO ()
main= do
initGUI
window <- windowNew
set window [windowTitle := "Calendar",
windowDefaultWidth:= 200,
windowDefaultHeight:= 100]
mainbox <- vBoxNew True 0
containerAdd window mainbox
hbox1 <- hBoxNew True 0
boxPackStart mainbox hbox1 PackGrow 0
cal <-calendarNew
boxPackStart hbox1 cal PackGrow 0
vbox1 <- vBoxNew True 0
frame1 <- frameNew
set frame1 [frameLabel := "Display Options",
containerBorderWidth := 10,
frameLabelYAlign := 0.5,
frameLabelXAlign := 0.5,
containerChild := vbox1 ]
boxPackStart hbox1 frame1 PackGrow 0
headingopt <- addDisplayOpt vbox1 "Show Heading"
daynameopt <- addDisplayOpt vbox1 "Show Day Names"
monchngopt <- addDisplayOpt vbox1 "No Month Change"
weeknumopt <- addDisplayOpt vbox1 "Show Week Numbers"
set headingopt [toggleButtonActive := True]
set daynameopt [toggleButtonActive := True]
reslabel <- labelNew Nothing
showMess cal reslabel "Nothing Done Yet"
frame2 <- frameNew
set frame2 [frameLabel := "Last Action:",
containerBorderWidth := 10,
containerChild := reslabel]
boxPackStart mainbox frame2 PackGrow 0
mySetOnToggled headingopt cal calendarShowHeading
mySetOnToggled daynameopt cal calendarShowDayNames
mySetOnToggled monchngopt cal calendarNoMonthChange
mySetOnToggled weeknumopt cal calendarShowWeekNumbers
onDaySelected cal (showMess cal reslabel "Day Selected")
onDaySelectedDoubleClick cal
(showMess cal reslabel "Double Click Day Selected")
widgetShowAll window
onDestroy window mainQuit
mainGUI
addDisplayOpt :: VBox -> String -> IO CheckButton
addDisplayOpt box lbl = do
cb <- checkButtonNewWithLabel lbl
boxPackStart box cb PackGrow 5
return cb
mySetOnToggled :: CheckButton -> Calendar ->
Attr Calendar Bool ->
IO (ConnectId CheckButton)
mySetOnToggled cb cl att = onToggled cb $ do
cbstate <- get cb toggleButtonActive
set cl [att := cbstate]
showMess :: Calendar -> Label -> String -> IO ()
showMess cal lbl str = do
(year, month, day) <- calendarGetDate cal
labelSetText lbl $ str ++ "\n" ++ "Date = " ++
(show year) ++ "//" ++
(myshow (month +1)) -- month is 0 to 11
++ "//" ++ (myshow day)
where myshow n | n <= 9 = '0':(show n)
| otherwise = show n
{- Commented out for platform specific testing:
These signals all seem to be implemented as onDaySelected.
The platform was: Gtk2Hs 0.9.12 on Fedora Core 6
onMonthChanged cal (showMess cal reslabel "Month Changed")
onNextMonth cal (showMess cal reslabel "Next Month Selected")
onNextYear cal (showMess cal reslabel "Next Year Selected")
onPrevMonth cal (showMess cal reslabel "Previous Month
Selected")
onPrevYear cal (showMess cal reslabel "Previous Year
Selected")
-}